import allure

from core.rest_client_new import RestClient
from utils.AssertUtil import AssertUtil
from utils.ExtractUtil import ExtractUtil


class ApiService:
    def __init__(self):
        self.session = RestClient()
        self.extract = ExtractUtil()
    def handle_case(self,test_data, login_token = None):
        #获取url
        #url = test_data['request_info']['url']
        url = self.extract.extract_url(test_data['request_info']['url'])
        # 获取method
        method = test_data['request_info']['method']
        # 获取headers
        headers = test_data['request_info']['headers']
        if login_token:
            headers.update(login_token) #login_token是testcases/conftest.py里的session级fixture函数，是一个字典，headers也是一个字典，这个代码表示字典headers内添加login——token形成新的字典headers
        #获取测试用例的title
        allure_title = test_data['request_info']['case_title']
        # 给allure报告定义用例标题
        allure.dynamic.title(allure_title)  # @的()只能写字符串且写在函数外，直接allure.dynamic的里面可以写变量且写在函数内，两者功能一样
        # 获取case_info
        case_info = test_data['case_info']
        # 获取validate
        validate = case_info.pop('validate', None)#获取validate的值的同时，从case_info中删掉validate和它的值，适用于列表/字典，列表的话括号里写索引的值，字典的话括号里写key,此处为字典，括号内加上, None的话就算case_info字典里本来就没有validate可以删除、运行这条代码也不会报错
        #获取extract
        extract = case_info.pop('extract', None)#获取并从case_info中删除extract和它的值，None的作用同上行
        case_info = self.extract.extract_case(case_info)
        res = self.session.do_request(url,method,headers=headers,**case_info)#**case_info解字典，将字典case_info里的key:value解成key=value的格式
        #将extract写入yaml
        self.extract.extract_data(res, extract)
        #断言逻辑
        AssertUtil().validate_response(res, validate)
        return res




    


